#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(int *p1, int* p2)
{
	return *p1 - *p2;
}

void Swap(char* p1, char* p2, int width)
{
	for (int i = 0; i < width; i++)
	{
		char tmp = p1[i];
		p1[i] = p2[i];
		p2[i] = tmp;
    }
}

void print_arr(int* arr, int sz)
{
	for (int i = 0; i < sz; i++)
		printf("%d ", arr[i]);
	printf("\n");
}
void bubble_sort(void* p, int sz, int width, int (*cmp)(void* p1, void* p2))
{
	for (int i = 0; i < sz - 1; i++)
	{
		for (int j = 0; j < sz - 1 - i; j++)
		{
			if (cmp((char*)p + j * width, (char*)p + (j + 1) * width))
			{
				Swap((char*)p + j * width, (char*)p + (j + 1) * width,width);
			}
		}
	}
	print_arr(p, sz);
}

void test1()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int width = sizeof(arr[0]);
	bubble_sort(arr, sz, width, cmp);

}

int main()
{
	test1();
	return 0;
}
//int cmp_int(int* p1, int* p2)
//{
//	return *p1 - *p2;
//}
//
//void print_arr(int* arr, int sz)
//{
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}
//
//void test1()
//{
//	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int width = sizeof(arr[0]);
//	qsort(arr, sz, width, cmp_int);
//	print_arr(arr, sz);
//}
//
//struct stu
//{
//	char name[10];
//	int age;
//};
//
//void cmp_stu_by_name(struct stu* p1, struct stu* p2)
//{
//	return strcmp(p1->name, p2->name);
//}
//
//void print_stu(struct stu* p, int sz)
//{
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%s %d\n", p->name, p->age);
//		p++;
//	}
//}
//
//void test2()
//{
//	struct stu s1[2] = { {"zhangsan",12},{"lisi",10}};
//	int sz = sizeof(s1) / sizeof(s1[0]);
//	int width = sizeof(s1[0]);
//	qsort(s1, sz, width, cmp_stu_by_name);
//	print_stu(s1, sz);
//}
//
//int main()
//{
//	//test1();
//	test2();
//	return 0;
//}